어느 정도 안전한 업데이트가 가능한 SQL레지스트리를 구현해보자.

ConcurrentHashMap을 이용한 수정 가능 SQL 레지스트리

멀티스레드 환경에서 안전하게 HashMap을 조작하려면 Collections.synchronizedMap()등을 이용해 외부에서 동기화해줘야 한다. 하지만 이렇게 HashMap에 대한 전 작업을 동기화하면 SqlService처럼 DAO의 요청이 많은 고성능 서비스에서는 성능에 문제가 생긴다. 그래서 동기화된 해시 데이터 조작에 최적화되도록 만들어진 ConcurrentHashMap을 사용하는 방법이 권장된다.
ConcurrentHashMap은 데이터 조작 시 전체 데이터에 대해 락을 걸지 않고 조회는 락을 아예 사용하지 않는다.

수정 가능 SQL 레지스트리 테스트

SQL 등록한 것이 잘 조회되는지 확인해야 하고, 이를 수정한 후에 수정된 SQL이 바르게 적용됐는지 확인해봐야 한다. 또 존재하지 않는 SQL에 대해 수정을 시도했을 때 적절한 예외가 발생하는지도 검증해보자.

내장형 데이터베이스를 이용한 SQL 레지스트리 만들기

ConcurrentHashMap 대신 내장형 DB를 이용해 SQL을 저장하고 수정하도록 만들어보자. 내장형 DB는 애플리케이션에 내장돼서 어플리케이션과 함께 시작되고 종료되는 DB를 말한다.

스프링의 내장형 DB 지원 기능

스프링은 내장형 DB를 손쉽게 이용할 수 있도록 내장형 DB 지원 기능을 제공하고 있다. 일종의 내장형 DB를 위한 서비스 추상화 기능인데, 다른 서비스 추상화처럼 별도의 레이어와 인터페이스를 제공하지는 않는다. 대신 내장형 DB를 초기화하는 작업을 지원하는 편리한 내장형 DB 빌더를 제공한다.

트랜잭션 적용

내장형 DB를 사용하는 경우에는 트랜잭션 적용이 상대적으로 쉽다.